"""
异常触发

raise语句支持强制除法指定的异常

raise唯一的参数就是要触发的异常，这个参数必须是异常实例或者异常类(派生自异常类)
如果传递的是异常类，将通过调用没有参数的构造函数来隐式实例化

参考文档：https://docs.python.org/zh-cn/3/tutorial/errors.html#raising-exceptions
"""

def testRaiseException():
    """异常触发

    """

    exceptionCaught = False

    try:
        # raise的使用范例
        raise NameError("HiThere")
    except NameError:
        exceptionCaught = True
        print("raise NameError is {}".format(exceptionCaught))
    
    print("raise NameError is Done")

def testUserDefineException():
    """用户自定义异常
    
    """

    # 程序可以通过创建新的异常类命名自己的异常。不论是以直接还是间接的方式，异常都应从Exception类派生；
    # 大多数异常命名都以“Error”结尾，类似标准异常的命名；
    # 许多标准模块都需要自定义异常，以报告由其定义的函数中出现的错误

    # 用户自定义异常
    class MyCustomError(Exception):
        """用户自定义异常.
        """
        def __init__(self, message):
            super().__init__(message)
            self.message = message
    
    customException = False

    try:
        raise MyCustomError("My Custom message")
    except MyCustomError:
        customException = True
        print("raise MyCustomError is {}".format(customException))
    
    print("raise MyCustomError is Done")

testRaiseException()
testUserDefineException()